package ocio.services;

import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import ocio.actions.AddReservaAction;
import ocio.beans.Admin;
import ocio.beans.Cliente;
import ocio.beans.Oferta;
import ocio.beans.Reserva;
import ocio.dao.ReservaDao;

/**
 * Clase encargada de ofrecer la lógica de negocio asociada a la clase Reserva.
 * Ofrece funciones CRUD para la gestión de reservas.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Reserva
 * @see ocio.services.ServiceIF
 */
public class ReservaService implements ServiceIF {

	ReservaDao reservaDao;
	
	public ReservaService (){
		reservaDao = new ReservaDao();
	}

	/**
	 * Solicita que se añada una reservar con los datos recogidos en objeto de la clase Action.
	 * @param form objeto de la clase Action con los datos de la reserva.
	 */
	@Override
	public boolean add(Action form) {
		
		Reserva reserva = new Reserva();
		AddReservaAction rform = (AddReservaAction) form;
		
		int idUsuario;
		String rol;
		
		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		OfertaService ofertaService = (OfertaService)serviceLocator.getService("Oferta");
		
		// Recuperar usuario y añadirselo a la oferta
		Map<String,Object> sesion = ActionContext.getContext().getSession();
		idUsuario = (Integer)sesion.get("USUARIO");
		rol = (String)sesion.get("ROL");
		
		if (rol.equalsIgnoreCase("Cliente")){
			ClienteService clienteService = (ClienteService)serviceLocator.getService("Cliente");
			Cliente cliente = new Cliente();
			cliente = (Cliente)clienteService.searchById(idUsuario);
			reserva.setCliente(cliente);
		} else {
			AdminService adminService = (AdminService)serviceLocator.getService("Admin");
			Admin admin = new Admin();
			admin = (Admin) adminService.searchById(idUsuario);
			reserva.setAdmin(admin);
		}
		
		// Recuperar oferta
		Oferta oferta = (Oferta)ofertaService.searchById(rform.getIdOferta());
		reserva.setOferta(oferta);
		
		//Establecer fecha. Si es espectáculo, la fecha límite es la fecha del mismo
		reserva.setFecha(rform.getFecha());
		
		//Establecer número de plazas comprobando aforo
		reserva.setNumPlazas(rform.getNumPlazas());
		
		//Dar de alta la reserva
		reservaDao.attachDirty(reserva);
				
		return true;
	}

	
	/**
	 * Solicita la lista de todas las reservas que cumplan con los requisitos
	 * introducidos en un formulario y recogidos en un objeto de la clase Action
	 * @param form objeto de la clase Action con los criterios de búsqueda.
	 * @return listaReservas Lista de todas las reservas que cumplen los criterios de búsqueda.
	 */
	public List<Object> searchByFields(Action form){
		return null;
	}   

	@Override
	public void update(Action form) {
			
	}
	
	/**
	 * Búsqueda de reserva por identificador.
	 * @param id identifificador en la base de datos de la reserva.
	 * @return p Objeto correspondiente a la reserva con el identificador dado.
	 */
	public Object searchById(int id){
		Reserva r;
		r = reservaDao.findById(id);
		return r;
	}

	/**
	 * Borra la reserva.
	 * @param o Objeto correspondiente a la reserva que se quiere borrar.
	 */
	@Override
	public void delete(Object o) {
		Reserva r;
		r = (Reserva)o;
		reservaDao.delete(r);
	}

}

